﻿package utils 
{
	import flash.text.TextField;
	
	/**
	 * ...
	 * @author Slavshik Alexander
	 */
	public class StringUtil 
	{
		/**
		 * Класс работы со строками. Конвертация дат/цифр в слова, форматирование строк.
		 */
		
		public function StringUtil() {}
		
		/**
		 * Названия месяцев в родительном падеже.
		 */
		public static const months/*String*/:Array = ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"];
		
		/**
		 * Обрезает пробелы у строки слева и справа.
		 * @param	str - строка
		 * @return обрезанная строка
		 */
		public static function trim(str:String):String {
			str = StringUtil.trimLeft(str);
			if (str == "") return str;
			str = StringUtil.trimRight(str);
			return str;
		}
		/**
		 * Обрезает пробелы у строки слева.
		 * @param	str - строка
		 * @return обрезанная строка
		 */
		public static function trimLeft(str:String):String {
			var j:int = 0;
			while (str.charAt(j) == " ") j++;
			str = str.substr(j, str.length);
			return str;
		}
		/**
		 * Обрезает пробелы у строки справа.
		 * @param	str - строка
		 * @return обрезанная строка
		 */
		public static function trimRight(str:String):String {
			var j:int = str.length - 1;
			while (str.charAt(j) == " ") j--;
			str = str.substr(0, j + 1);
			return str;
		}
		/**
		 * Чистит строку от лишних переводов строки, подгруженную извне.
		 * @param	str
		 * @return
		 */
		public static function clearXMLString(str:Object):String {
			return String(str).split("\r").join("");
		}
		/**
		 * Обрезает строку, если количество символов в ней длинее maxlen.
		 * @param	str - строка
		 * @param	maxlen - максимальное количество символов
		 * @return
		 */
		public static function cropString(str:String, maxlen:int):String {
			if (str.length > maxlen) return str.substr(0, maxlen - 3) + "...";
			return str;
		}
		/**
		 * Обрезает текст в текстовом поле, если его длина больше maxlen.
		 * @param	tf - TextField
		 * @param	maxlen - максимальная ширина текстового поля
		 * @return
		 */
		public static function cropTextLine(tf:TextField, maxlen:Number):String {
			if(tf.textWidth < maxlen) return tf.text;
			var s:String = tf.text;
			var i:int = 0;
			var w:Number = tf.getCharBoundaries(0).width;
			while (true) {
				if (w > maxlen) {
					tf.replaceText(i - 2, tf.length, '...');
					s = tf.text;				
				}
				if (i < tf.text.length - 1) {
					i++;
					w += tf.getCharBoundaries(i).width;
				}else break;
			}
			return s;
		}
		/**
		 * Выводит читабельную дату.
		 * @param	d - дата в секундах
		 * @return день месяц год
		 */
		public static function getDate(d:Object):String {
			var r:String = "";
			var date:Date;
			if (d is Date) date = d as Date;
			else if (d is Number) date = new Date(int(d) * 1000);
			else return String(d);
			trace(date)
			var month:String = months[date.getMonth()];
			r = date.getDate() + " " + month + " " + date.fullYear;
			return r;
		}
		/**
		 * Выводит число(до 10) словом.
		 * @param	count - число
		 * @return слово или число, если оно больше 10
		 */
		public static function countWord(count:int):String {
			var r:String = String(count);
			switch(count) {
				case 0:
					r = "нет";
				break;
				case 1:
					r = "одна";
				break;
				case 2:
					r = "две";
				break;
				case 3:
					r = "три";
				break;
				case 4:
					r = "четыре";
				break;
				case 5:
					r = "пять";
				break;
				case 6:
					r = "шесть";
				break;
				case 7:
					r = "семь";
				break;
				case 8:
					r = "восемь";
				break;
				case 9:
					r = "девять";
				break;
			}
			return r
		}
		/**
		 * Склоняет слово.
		 * @param	count - количество
		 * @param	word1 - День
		 * @param	word2 - Дня
		 * @param	word5 - Дней
		 * @return слово
		 */
		public static function wordCount(count:int, word1:String, word2:String, word5:String):String {
		  var n:Number = Math.abs(count) % 100;
		  var n1:Number = n % 10;
		  if (n > 10 && n < 20) return word5;
		  if (n1 > 1 && n1 < 5) return word2;
		  if (n1 == 1) return word1;
		  return word5;
		} 
		
	}
	
}